# 使用 while 和 for…in 两个循环分别输出四种九九乘法表效果（共计 8 个）


# 使用 while 循环第一个99乘法表
col=1   # 列初始，并进入循环
while col<10:
    row = 1   # 行初始，并进入循环
    while row<col+1:  #每一排的特点是： 列不变，行从1循环到当前列的值
        print('{}*{}={:<4}'.format(row, col, row * col),end=' ')
        row = row + 1
    print(' ')
    col=col+1 #列自增
print('='*100)
print(' ')

# 使用 while 循环第二个99乘法表
col=9    #列从9开始递减
while 0<col<10:  #当列小于0，或者大于10后，跳出循环
    row=1  #行从1开始递增
    while row<col+1:  #每一排，行是自增到9，但小于本列的值
        print('{}*{}={:<4}'.format(row, col, row * col),end=' ')
        row=row+1
    print(' ')
    col=col-1
print('='*100)
print(' ')

# 使用 while 循环第三个99乘法表
# 每一排的输出从左边开始空的位置按照列的值来计算，（9-列的值）就是空出来的位置
col=1   # 列初始，并进入循环
while col<10:
    k=9-col  # 用k来表示空出的位置，并进入循环
    while k>0: # 当k的值小于0的时候就跳出循环
        print(' '*9,end='') # 当k满足条件的时候，直接进行输出空格
        k=k-1                # k自减，每减去一个输出一次9倍的空格，直到不满足条件跳出循环
    row = col                # 行初始 每一排行开始的值都是本行的列值
    while row>0:  # 当行值递减到0的时候跳出循环
        print('{}*{}={:<4}'.format(row, col, row * col),end=' ') #一个等式占用的是9个字符，空格
        row = row - 1      #行值递减
    print(' ')
    col=col+1 #列自增
print('='*100)
print(' ')

# 使用 while 循环第三个99乘法表
col=9    # 每一排中，列数都是相同的，所以列数为大循环，从9开始
while col>0:
    k=9-col  # k表示每一排的空位置，第一排是0，第二排是1，第三排是2，可见k的值和本排中列的值的和为9
    while k>0:
        print(' '*9,end='') # 一个等式占用了9个字符，且每次输出完后要不换行
        k=k-1
    row=col
    while row>0:
        print('{}*{}={:<4}'.format(row, col, row * col), end=' ')
        row=row-1
    print(' ')
    col=col-1
print('='*100)
print(' ')


# for...in循环 第一个乘法表
'''
定义row * col 为行和列，分析图形可看出行是在每排里从1开始到本排的列的值，那就是（1，col+1）的遍历。
列是从（1,10）的遍历。
每一排里行在变化，列值不变.所以，行是小遍历，列是大遍历
'''
for col in range(1,10):
    for row in range(1,col+1):
        print('{}*{}={:<4}'.format(row, col, row * col), end=' ')
    print(' ')
print('='*100)
print(' ')


# for...in循环 第二个乘法表
'''
定义row * col 为行和列，分析图形可看出行是在每排里从1开始到本排的列的值，那就是（1，col+1）的遍历。
列是从（9,0，-1）的倒序的遍历
每一排里行在变化，列不变，所以列为大循环遍历，行为小循环遍历
'''
for col in range(9,0,-1):
    for row in range(1, col+1):
        print('{}*{}={:<4}'.format(row, col, row * col), end=' ')
    print(' ')
print('='*100)
print(' ')

# for...in循环 第三个乘法表
'''
定义row * col 为行和列，分析图形可看出行是在每排里从本排的列的值开始到1，那就是（col,0,-1）的倒序遍历。
列是从（1,10）的遍历
每一排里行在变化，列不变，所以列为大循环遍历，行为小循环遍历
其中空的位置也在做循环，循环值是和列相关的，假设空的位置为k，k+col=9，k是从9-col开始遍历到0
'''
for col in range(1,10):
    for k in range(9-col,0,-1):
        print(' '*9,end='')
    for row in range(col,0,-1):
        print('{}*{}={:<4}'.format(row, col, row * col), end=' ')
    print(' ')
print('='*100)
print(' ')


# for...in循环 第三个乘法表
'''
定义row * col 为行和列，分析图形可看出行是在每排里从本排的列的值开始到1，那就是（col,0,-1）的倒序遍历。
列是从（9,0,-1）的遍历,从9开始到1结束，倒序遍历
每一排里行在变化，列不变，但每两排的列值不同，说明行遍历完了以后开始遍历列，所以列为大循环遍历，行为小循环遍历
其中空的位置也在做循环，循环值是和列相关的，假设空的位置为k，k+col=9，k是从9-col开始遍历到0
'''
for col in range(9,0,-1):
    for k in range(9-col,0,-1):
        print(' '*9,end='')
    for row in range(col,0,-1):
        print('{}*{}={:<4}'.format(row, col, row * col), end=' ')
    print(' ')
print('='*100)
print(' ')

# 使用文件和目录操作，定义一个统计指定目录大小的函数（注意目录中还有子 目录）。
import os
def size_dir(dir1):   # 定义统计目录 大小的函数
    sum=0             #大小的值用sum表示
    dlist= os.listdir(dir1)     #打开一个目录
    for f in dlist:               #将目录中所有元素遍历出来
        file=os.path.join(dir1,f)   #将所有元素的路径进行拼接，得到文件
        if os.path.isfile(file):     # 如果这确实是文件，而不是文件夹，那么直接求这个文件的大小
            sum=os.path.getsize(file)
        if os.path.isdir(file):       #如果这是一个文件夹，将目录再操作一次
            sum=sum+size_dir(file)     #调用本函数，递归方式再进行
    return sum



# 实现一个自动取款机的存取款模 拟效果。要求有登陆和退出、查询余额、取钱，存钱等操作
'''
1. 数据结构
2. 登陆
3. 余额查询
4. 取钱
5. 存钱
6 退出
7. 交互界面
'''

# 建立数据结构
acc_info=[
    {'accountNo':'001','name':'zhangsan','password':'123','balance':100},
    {'accountNo':'002','name':'lisi','password':'123','balance':200},
    {'accountNo':'003','name':'xiaohong','password':'123','balance':300}]


user_info= []   #定义一个参数变量，为了下面使用for...in遍历后，能够跳出循环取判断，判断的方式是用这个list中是否含有数值

# 登陆
def logIn():                                   #定义登陆功能的函数
    print('=' * 20, 'Welcome!', '=' * 20)
    print('请先登录系统，按步骤输入您的信息：')
    global user_info                            # 将变量定义为全局变量，这样可以在其他函数和操作中直接调用，而不是只局限于此函数
    user_acc = input('请输入你的账户号码：')
    user_name = input('请输入你的名字：')
    user_pas = input('请输入你的密码：')

    for i, user_dict in enumerate(acc_info):     #遍历数据结构中所有元素，并挨个和用户输入的内容进行比对，是否完全等于
        if user_dict['accountNo']==user_acc and user_dict['name']==user_name and user_dict['password']==user_pas:
            user_info.append(i)                                 #如果完全等于，就加入定义的参数list中，否则无法跳出遍历循环
            user_info.append(user_dict['name'])
            user_info.append(user_dict['password'])
    if len(user_info)>0:                                        #如果这个list里面有值，说明用户输入的内容对比后是完全一致的
        print('登陆成功')
    else:
        print('登陆失败')
        a=input('你输入的信息有误，是否要重新输入？ 请选择：Y/N ')
        if a=='Y':
            logIn()                                        #如果没有值，则说明输入错误，如果用户还需要继续输入，则调用本函数，递归
        else:
           print('退出登陆')

# 余额查询
'''
字典通过key提取value，list通过索引提取值。那么如何找到数据源里的对应的索引是关键。
已知用户的名字和密码，并存在user_info这个list中。
user_info 的元素包含，名字和密码，以及通过for...in遍历出的索引，这个索引就是数据源中的索引
索引数值在user_info中的位置是【0】，通过user_info[0]取出索引值，在acc_info中用【索引值】【key】，找到value
'''
# print('您的账户余额为{}元!'.format(acc_info[user_info[0]]['balance']))


# 取钱
'''
取的数额需要拿来和已有的余额进行判断，是否是小于余额的，否则是无效的
当小于余额时，用余额减去取款金额
'''
def drawMoney():
    print('您的账户当前余额为{}元!'.format(acc_info[user_info[0]]['balance']))
    bal=acc_info[user_info[0]]['balance']
    m=int(input('请输入您要取款的金额：'))
    if m<=bal:
        newBal=bal-m
        print('取款成功！')
        print('您的账户当前余额为{}元!'.format(newBal))
        acc_info[user_info[0]]['balance']=newBal                   #将新的余额覆盖已有的数值
    else:
        a=input('您输入的金额不正确，是否需要重新输入，Y/N: ')
        if a=='Y':
            drawMoney()                                            #递归 调用本函数
        else:
            print('已取消取款操作')

# 存钱
def saveMoney():
    print('您的账户当前余额为{}元!'.format(acc_info[user_info[0]]['balance']))
    bal=acc_info[user_info[0]]['balance']
    m=int(input('请输入您要存款的金额：'))
    newBal=bal+m
    print('存款成功！')
    print('您的账户当前余额为{}元!'.format(newBal))
    acc_info[user_info[0]]['balance'] = newBal

#界面交互
logIn()                                                                         # 先让用户进行登录，确认登录信息后，进入操作系统
while True:                                                                     #进入操作系统，用循环方式让用户进行选择
    print('='*20,'自动存取款系统','='*20)
    print('{:8}{:<25}{:<20}'.format(' ','1.查询余额','2. 存款'))
    print('{:8}{:<26}{:<20}'.format(' ','3.取款','4. 退出'))
    print('='*55)
    a=int(input('请选择你要办理的业务：'))
    if a==1:
        print('您的账户余额为{}元!'.format(acc_info[user_info[0]]['balance']))
        input('按任意键继续！')
    elif a==2:
        saveMoney()
        input('按任意键继续！')
    elif a==3:
        drawMoney()
        input('按任意键继续！')
    elif a==4:
        print('=' * 23, '再见!', '=' * 24)
        break                                                                   #跳出循环
    else:
        print('您的选择无效')
        input('按任意键继续！')